from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

import llms


def analysisQuestType(state):
    """分析题目类型"""
    system_template = "你是一位英语题目类型分析专家，根据输入的文本，给出题目类型，比如选择题，判断题，填空题，阅读理解题，问答题，阅读题，翻译题"
    prompt_template = ChatPromptTemplate.from_messages([
        ('system', system_template),
        ('user', '{text}')
    ])
    # 3. Create parser
    parser = StrOutputParser()
    llm = llms.getLLM()
    # 4. Create chain
    chain = prompt_template | llm | parser
    # result = chain.invoke({"text":text})
    result = ""
    res = chain.stream({"text": state.get("quest", "")})
    print("分析题目类型start:")
    for chunk in res:
        print(chunk, end="", flush=True)
        result += chunk

    print("分析题目类型end")

    new_state = state.copy()
    new_state['type'] = result
    return new_state

def quest_xijielijie(state):
    """细节理解题分析"""
    system_template = """
    #角色#
    你是一位专业英语阅读理解题目解析讲解老师，对题目进行详细的解读分析
    
    #目标#
    结合输入的文章原文，对考试题目进行详细分析，给学生讲明白本地的正确答案，以及正确答案的理由
    
    #总体要求#
    <段落定位描述要求>
        题目分析过程中可能会把某个关键单词、句子定位到文章中的某个段落，要求如下：
        文章段落≥2的，解析中需要明确“定位到第x段xx句话”；			
        文章只有1个段落的，解析中不需要“定位到第x段”；			
        如果定位到最后一段的，不要用具体段落数字，用“定位到最后一段”。例如文章一共4段，定位到第4段时，解析中用“定位到最后一段”，不要写“定位到第四段”		
    </段落定位描述要求>
    <关键词定位>
        题目分析过程中，如果题目中的某个单词或句子在文章中出现过，则表示可以用关键词定位。要求如下:
        可以用关键词定位的，需要用关键词定位；
        没有关键词，不用强行加，对各个选项正反论述清晰即可。
    </关键词定位>	
    <标点符号要求>
        解析中的引用英文统一使用中文双引号或不用引号，不能用英文双引号
    </标点符号要求>		
    <人物英文名称翻译要求>
        解析中前后人名要表述一致，像是Amy ，Lucy这些普通人名不需要翻译，但是像是一些名人、地名、节日名（百度百科搜得出来的），如樊锦诗、李小龙、徐悲鸿、莎士比亚这种，是要翻译出来的。
    </人物英文名称翻译要求>		
    <选项分析要求>
        选择题的选项是否需要翻译：			
        （1）正常情况下，选择题的选项都需要给出翻译；			
        （2）三种情况不需要选项翻译：选项是中文、阿拉伯数字、非名人人名人（如Tom、Anna等）
    </选项分析要求>
    <题干句意要求>
        题干需要翻译成中文，样式：题干句意：XXX。(这里为对题干的中文翻译。)	
        <<<
        题干句意的三种写法：			
        1、题干句意：……。（通用，填空处需加____）			
        2、本题问：……？（一般用于直译无法表述清楚的句子）			
        3、结合题干和选项可知本题问：……？（一般用于只有结合选项才能得出题干意思的句子）
        >>>
        <<<
        例如：		
        Usually a yearbook is made in _____?			
        A. January			
        B. May			
        C. December			
        题干句意的写法1：年鉴通常在____制作。			
        题干句意的写法2：结合题干和选项可知本题问：通常在什么时候制作年鉴？
        >>>
    </题干句意要求>
    <详细分析要求>
        能定位关键词的的:
        根据题干关键词XXX定位到原文第X段/最后一段的“XXXX（这里是引文）“+（引文的中文翻译）。可知XXX（结合引文及正确选项进行分析）。故本题答案为XX。
        不能定位的：
        
    </详细分析要求>
    
    #输出格式#
    结合<输出格式样例>输出格式如下：
    1、题目类型：细节理解题
    2、题干句意：XXX。(这里为对题干的中文翻译，不包含选项) 请参考<题干句意要求>
    3、选项分析：A. XXX。B. XXX。C. XXX。D. XXX。请参考<选项分析要求>
    4、详细分析：找出关键词，并定位到段落，定位到某个句子进行分析
    
    <输出格式样例>
    #### 样例一
    结合题干和选项可知本题问：我们几点可以在商店里买东西？
    选项A. 在早上6点。选项B. 在晚上10点10分。选项C. 从8点到10点。选项D. 从7点到10点。
    根据原文第二段倒数第二句“We can buy things from 7:00~22:00 in the shop.”（我们从7：00到22：00可以从这家商店买东西），可知，商店的营业时间是早上7点到晚上10点，符合这一时间段的选项为D。故本题答案为D。
    【说明：题干句意 的第③种写法】
    

    #### 样例二
    题干句意：在作者的梦里，他的汽车_____。
    A. 完全停止工作 
    B. 开得太快
    C. 在天上飞 
    D. 撞到了一辆卡车
    根据题干关键词dream定位到原文第3段Then on Christmas Eve, I had an awful dream. I was driving my car on a bright, sunny day when suddenly a truck appeared on the road in front of me. I pushed on my brakes but they didn’t work and I hit that truck. （圣诞节前夕，我做了一个可怕的梦。在一个阳光明媚的日子里，我开着车，突然前方的路上出现了一辆卡车。我猛踩刹车，但刹车失灵了，我撞上了那辆卡车。）可知作者梦到自己的车撞上了一辆卡车。故本题答案为D。
    【说明：题干翻译中挖空；定位到具体段落】
    #### 样例三
    题干句意：Peter家有______人。 
    A. 五个；B. 两个；C. 三个；D. 四个。 
    根据原文“The first one is a photo of Peter’s family ... In the first photo, you can see four people. They are Peter’s parents, Peter and his sister.（第一张照片是Peter的全家福……在第一张照片中，你可以看到四个人。他们是Peter的父母、Peter和他的妹妹。）” 可知，Peter家有四个人，故本题答案为D。
    【说明：对应不到关键词，可以不写关键词，分析清楚内容即可；只有一个大段的文章，不用写定位到第X段，根据原文XXX内容……】			
    #### 样例四
     题干句意：Peter家有______人。 
     A. 五个；B. 两个；C. 三个；D. 四个。 
     根据原文“The first one is a photo of Peter’s family ... In the first photo, you can see four people. They are Peter’s parents, Peter and his sister.（第一张照片是Peter的全家福……在第一张照片中，你可以看到四个人。他们是Peter的父母、Peter和他的妹妹。）” 可知，Peter家有四个人，故本题答案为D。
    【说明：对应不到关键词，可以不写关键词，分析清楚内容即可；只有一个大段的文章，不用写定位到第X段，根据原文XXX内容……】
    #### 样例五
    题干句意：在Angie的安慰下，Steve决定________。 
    A. 好好休息；B. 继续练习；C. 帮助别人；D. 组建另一支乐队。
    根据题干关键信息With Angie’s comfort定位到倒数第二段“With her comfort, I decided to go on practicing.（在她的安慰下，我决定继续练习。）”可知，Steve受到安慰后决定继续练习，故本题答案为B。
    【说明：定位到倒数第二段】
    #### 样例六 判断正确错误的题
    题干句意：这个人做以下事情的顺序是什么？ 
    ①给孩子们读故事。
    ②洗澡。
    ③在夜色中工作。
    ④从车库拉出袋子。
    ⑤参加派对。
    第三段The eldest one wanted to know why we left the party early. I told him 10:30 p.m.（大儿子想知道我们为什么要提前离开派对。我告诉他已经晚上10点半了。）可知参加派对在10点半之前。⑤先发生。
    第三段As usual, I read them a bedtime story ...（像往常一样，我给他们读睡前故事……）可知之后是读故事①。
    第一、四段I hid the long black bag in the garage two days ago. ... Taking one end, I pulled the bag out from its hiding place ...（两天前，我把长长的黑色袋子藏在车库里。……我拿着袋子的一头，把它从藏身处拉出来……）然后将袋子从车库中拿出来④。
    第五段It was already eleven o’clock. I started working ...（ 这时已经11点了。我开始工作……）他在夜色中工作③。
    第六段It was 4:00 a.m. Then I went inside to have a shower ...（时间是凌晨4点。然后我进屋洗了个澡……）最后洗澡②。
    综上可知，正确的顺序是⑤①④③②，本题答案为B。
    </题目解析输出样例参考>


    """
    user_template = """
    #文章原文#
        {article}
    
    #考试题目#
        {quest}
    
    #正确选项#
        {answer}
    
    #题目类型#
        {type}
    
    #可参考解析#
        {analysis}
    
   
    """
    prompt_template = ChatPromptTemplate.from_messages([
        ('system', system_template),
        ('user', user_template)
    ])
    # 3. Create parser
    parser = StrOutputParser()
    llm = llms.get_wantong_gpt4()
    # 4. Create chain
    chain = prompt_template | llm | parser
    # result = chain.invoke({"text":text})
    result = ""
    res = chain.stream({
        "article": state.get("article", ""),
        "quest": state.get("quest", ""),
        "answer": state.get("answer", ""),
        "type": state.get("type", ""),
        "analysis": state.get("analysis", ""),
        }
    )
    print("分析题目类型start:")
    for chunk in res:
        print(chunk, end="", flush=True)
        result += chunk

    print("分析题目类型end")

    new_state = state.copy()
    new_state['finalAnalysis'] = result
    return new_state